package com.example.sample.activity;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.ListView;

import com.example.app.BaseActivity;
import com.example.sample.R;
import com.example.sample.logic.RiverContentProvider;

import androidx.cursoradapter.widget.CursorAdapter;
import androidx.cursoradapter.widget.SimpleCursorAdapter;

/**
 * 
 * SimpleCursorAdapter演示活动
 * 
 * @author LiangYu
 * @data: 2015-1-5 下午6:10:38
 * @version: V1.0
 */

/*******************************SimpleCursorAdapter被弃用的历史问题******************************
 * 
 * 在Android3.0之前，很多应用程序响应性能方面有缺陷。UI切换之间的小故障、activity切换延迟、ANR问题。
 * 响应性能方面的故障大多数来源于此事实----大多数开发者在UI线程中执行了查询操作---用这种方式载入数据是最差的选择。
 * 
 * 在这篇文章强调及时反馈的同时，Android3.0之前的APIs似乎并没有支持该特性。在Loaders之前，cursors主要通过两个
 * Activity方法（现在已经过时deprecated）来进行管理和查询：
 * 
 * public void startManagingCursor(Cursor)
 * 告诉activity根据自己的生命周期来管理cursor的生命周期。cursor会被自动deactivate()
 * 当活动stopped时。会自动close()
 * 当活动摧毁的时候。当活动stopped之后重新restarted，cursor会re-queried(requery())重新查询最新的数据。
 * 
 * public Cursor managedQuery(Uri, String, String, String, String)
 * 该函数是对ContentResolver的query()
 * 方法的包装。除了执行query之外，在它返回之前还会将调用startManagingCursor(cursor)。
 * 也就是说将这个query的cursor放入了activity生命周期管理了。
 * 
 * 用起来很方便的同时，上面的方法在UI线程中执行查询操作时，会导致严重的延迟问题。而且该“managed cursors”
 * 方式在activity配置变化（configurationchanged，横竖屏切换、键盘弹出等）时，
 * 并不会保持数据。在这些情况下会重新requery()数据，
 * 但是实际上是没有必要、低效，而且会导致方向切换呆滞和卡顿。
 * 
 * 1. managedQuery在Ui线程中执行了一个查询操作，这将导致应用无响应，这种方法不应该再使用。
 * 2. 通过查看Activity.java源码，可以知道managedQuery也顺便调用了startManagingCursor来管理查询到的数据。
 * 看起来很简便，因为我们不用考虑cursor后续的关闭、requery等。
 * 但是使用这种方式导致每次activity的状态从stopped返回时都需要重新查询数据，这通常会导致UI线程卡顿。
 * 让activity替我们管理cursor所冒的风险大于便捷性。
 * 3. SimpleCursorAdapter构造方法过时了，不应该再使用。
 * 该构造方法问题是，当有改变时，将导致SimpleCursorAdapter自动查询。
 * 更具体来说，CursorAdapter会在数据上注册一个ContentObserver监听器，当监听的数据变化时会requery数据。
 * 我们应该使用标准的构造函数（如果你尝试使用CursorLoader来载入适配器数据，确保最后一个参数传入值为0）。
 * 如果你不能理解第三条，没有关系，这仅仅只是个小错误。
 */
public class SimpleCursorAdapterActivity extends BaseActivity {

	private ListView mRiverListView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_simple_cursor_adapter);
		setRiverListViewAdapter();
	}

	@SuppressWarnings("deprecation")
	private void setRiverListViewAdapter() {
		mRiverListView = (ListView) this.findViewById(R.id.riverListView);
		Cursor cursor = managedQuery(RiverContentProvider.CONTENT_URI, null, null, null, null);
		
		String [] columnNameArray = new String[] {
				RiverContentProvider.NAME, RiverContentProvider._ID,
				RiverContentProvider.LENGTH };

		int [] colCtrlIdArray = new int[] { R.id.id, R.id.name, R.id.len };
		int itemResId = R.layout.item_simple_cursor_adapter_list;
		CursorAdapter adapter = new SimpleCursorAdapter(this, itemResId, cursor, columnNameArray, colCtrlIdArray);
		mRiverListView.setAdapter(adapter);
	}
}
